home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / heap.com / BADPTR.ASM next >
Encoding:
Assembly Source File  |  1989-03-08  |  2.4 KB  |  76 lines

  1. ;BADPTR.ASM
  2. ; used in BADPTR.PAS
  3.  
  4. ;****************************************************** Data
  5.  
  6. DATA    SEGMENT WORD PUBLIC
  7.         EXTRN   ErrorAddr:DWORD         ;Turbo's error address
  8.         EXTRN   PrefixSeg:WORD          ;Prefix segment of program
  9.         EXTRN   BadP:DWORD              ;Holds bad pointer if error
  10.         EXTRN   HeapBot:WORD            ;Lowest heap segment
  11.         EXTRN   HeapTop:WORD            ;Highest heap segment
  12. DATA    ENDS
  13.  
  14. ;****************************************************** Code
  15.  
  16. CODE    SEGMENT BYTE PUBLIC
  17.  
  18.         ASSUME  CS:CODE,DS:DATA
  19.  
  20.         PUBLIC  CheckBad
  21.         EXTRN   BadPointer:NEAR
  22.  
  23. ;****************************************************** CheckBad
  24.  
  25. ;interrupt service routine called when a pointer is dereferenced
  26. ;Entry: ES:DI contains pointer
  27. ;Exit:  all registers preserved
  28.  
  29. lo      EQU     (WORD PTR 0)
  30. hi      EQU     (WORD PTR 2)
  31.  
  32. CheckBad   PROC FAR
  33.         PUSH    SI                      ;Save register
  34.         MOV     SI,ES                   ;SI = segment of pointer
  35.         CMP     SI,HeapBot              ;Is pointer below HeapBot?
  36.         JB      CheckError              ;Jump if so
  37.         CMP     SI,HeapTop              ;Is pointer above HeapTop?
  38.         JAE     CheckError              ;Jump if so
  39.         POP     SI                      ;Restore register
  40.         IRET                            ;Return if all is OK
  41.  
  42. CheckError:
  43.         PUSH    AX                      ;Save registers in case
  44.         PUSH    BX                      ;   BadPointer returns
  45.         PUSH    CX
  46.         PUSH    DX
  47.         PUSH    DI
  48.         PUSH    ES
  49.  
  50.         MOV     BadP.lo,DI              ;Store value of pointer
  51.         MOV     BadP.hi,ES
  52.  
  53.         MOV     BX,SP                   ;Store error address
  54.         MOV     AX,SS:[BX+14]           ;AX=offset of error
  55.         MOV     ErrorAddr.lo,AX
  56.         MOV     AX,SS:[BX+16]           ;AX=segment of error
  57.         SUB     AX,PrefixSeg
  58.         SUB     AX,10h                  ;Convert to relative format
  59.         MOV     ErrorAddr.hi,AX
  60.  
  61.         CALL    BadPointer              ;Call error routine
  62.  
  63.         POP     ES
  64.         POP     DI
  65.         POP     DX
  66.         POP     CX
  67.         POP     BX
  68.         POP     AX
  69.         POP     SI
  70.         IRET                            ;Return in case BadPointer doesn't halt
  71. CheckBad   ENDP
  72.  
  73. CODE    ENDS
  74.  
  75.         END
  76.